void ScheduleDAGLinearize::ScheduleNode(SDNode *N) {
    //N初始是GraphRoot节点
    //含义：如果N的NodeId不为0，说明该节点已经被调度过（或状态异常），直接报错终止（防止重复调度）。
  if (N->getNodeId() != 0)
    llvm_unreachable(nullptr);
//含义：如果N不是机器指令，并且是EntryToken或“被认为是被动节点”（如常量等），则这些节点不需要生成机器指令，直接跳过，不调度。
  if (!N->isMachineOpcode() &&
      (N->getOpcode() == ISD::EntryToken || isPassiveNode(N)))
    return;
//含义：调试输出，打印当前正在调度的节点信息。然后把N加入调度序列（Sequence），表示N已被调度。
  LLVM_DEBUG(dbgs() << "\n*** Scheduling: ");
  LLVM_DEBUG(N->dump(DAG));
  Sequence.push_back(N);
//含义：准备遍历N的所有操作数（从最后一个到第一个）。GluedOpN用于记录Glue依赖的节点。
  unsigned NumOps = N->getNumOperands();
  if (unsigned NumLeft = NumOps) {
    SDNode *GluedOpN = nullptr;
    do {
        //获取节点N的操作数（从右至左）
      const SDValue &Op = N->getOperand(NumLeft-1);
      SDNode *OpN = Op.getNode();
		
    /*
        含义：如果当前操作数是第一个（即最后一个操作数，LLVM操作数顺序是倒序遍历），且类型是Glue，说明这		是Glue依赖。
        记录Glue依赖节点为GluedOpN。
        断言Glue节点的度不为0（即还未被调度完）。
        将Glue节点的度设为0（表示现在要调度它）。
        递归调度Glue节点（Glue节点必须在N之前被调度）。
		跳过本次循环（continue）。
    */
      if (NumLeft == NumOps && Op.getValueType() == MVT::Glue) {
        // Schedule glue operand right above N.
        GluedOpN = OpN;
        assert(OpN->getNodeId() != 0 && "Glue operand not ready?");
        OpN->setNodeId(0);
        ScheduleNode(OpN);
        continue;
      }
	//含义：如果当前操作数就是刚才已经调度过的Glue节点，跳过（避免重复调度）。
      if (OpN == GluedOpN)
        continue;
	//如果OpN在GluedMap中，且它的Glue用户不是N，说明OpN的依赖已经合并到它的Glue用户上了，所以把OpN替换为它的Glue用户（保证Glue链的依赖合并）
      DenseMap<SDNode*, SDNode*>::iterator DI = GluedMap.find(OpN);
      if (DI != GluedMap.end() && DI->second != N)
        // Users of glues are counted against the glued users.
        OpN = DI->second;
    /*
    	含义：获取OpN的度（还有多少依赖未满足）。
        度减一（因为N已经调度，OpN的一个依赖被满足）。
        如果度减到0，说明OpN所有依赖都已满足，可以递归调度OpN。
    */
      unsigned Degree = OpN->getNodeId();
      assert(Degree > 0 && "Predecessor over-released!");
      OpN->setNodeId(--Degree);
      if (Degree == 0)
        ScheduleNode(OpN);
    } while (--NumLeft);
  }
}